package ar.com.gals.controller;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import ar.com.gals.constants.Page;
import ar.com.gals.domain.Articulo;
import ar.com.gals.domain.Equivalencia;
import ar.com.gals.domain.Indice;
import ar.com.gals.domain.Observacion;
import ar.com.gals.domain.Operador;
import ar.com.gals.domain.UnidadMedida;
import ar.com.gals.domain.Usuario;
import ar.com.gals.error.GalsException;
import ar.com.gals.filter.ArticuloFiltro;
import ar.com.gals.service.ArticuloService;
import ar.com.gals.service.IndiceService;
import ar.com.gals.service.MarcaService;
import ar.com.gals.service.RubroService;
import ar.com.gals.service.TipoEquivalenciaService;
import ar.com.gals.service.TipoObservacionService;

@Controller
@RequestMapping(value = "/Catalogo")
public class CatalogoController extends AbstractController {
	
	@PreAuthorize("hasRole('CATLOG')")
	@RequestMapping(method = RequestMethod.GET)
    public String catalogo(Model model) {
		try 
		{
			model.addAttribute("marcas", new MarcaService().getAll());
			model.addAttribute("rubros", new RubroService().getAll());
			model.addAttribute("tipos_observaciones", new TipoObservacionService().getAll());
			model.addAttribute("tipos_equivalencias", new TipoEquivalenciaService().getAll());
			model.addAttribute("operadores", Operador.values());
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
		
        return Page.CATALOGO;
    }
	
	
	@PreAuthorize("hasRole('CATLOG')")
	@RequestMapping(value = "/Busqueda", method = RequestMethod.POST)
    public @ResponseBody String buscarArticulos(HttpServletRequest request, HttpServletResponse response) {
	
		try
		{
			ArticuloFiltro filtro = new ArticuloFiltro();
			filtro.setCodigo(request.getParameter("codigo").trim());
			filtro.setDescripcion(request.getParameter("descripcion").trim());
			filtro.setMarca((request.getParameter("marca").isEmpty()) ? null : Integer.parseInt(request.getParameter("marca")));
			filtro.setRubro((request.getParameter("rubro").isEmpty()) ? null : Integer.parseInt(request.getParameter("rubro")));
			filtro.setTipoObservacion((request.getParameter("tipoObservacion").isEmpty()) ? null : Integer.parseInt(request.getParameter("tipoObservacion")));
			filtro.setOperador((request.getParameter("operador") == null) ? null : Operador.valueOf(request.getParameter("operador")));
			filtro.setObservacion1(request.getParameter("observacion1").trim());
			filtro.setObservacion2(request.getParameter("observacion2").trim());
			filtro.setTipoEquivalencia((request.getParameter("tipoEquivalencia").isEmpty()) ? null : Integer.parseInt(request.getParameter("tipoEquivalencia")));
			filtro.setEquivalencia(request.getParameter("equivalencia").trim());
			filtro.validar();
			
			Usuario usuarioConectado = this.getUsuario();
			List<Articulo> articulos = new ArticuloService().getAll(filtro, false);
			List<Indice> indices = new IndiceService().getAll((usuarioConectado.isEmpleado()) ? usuarioConectado.getEmpleador() : usuarioConectado);
			
			List<JSONObject> jsonArticulos = new ArrayList<JSONObject>();
			
			for(Articulo articulo : articulos) {
				for(Indice indice : indices) {
					if(indice.getMarca().getId() == articulo.getMarca().getId() &&
						indice.getRubro().getId() == articulo.getRubro().getId()
					) {
						JSONObject jsonArticulo = new JSONObject();
						jsonArticulo.put("id", 	   articulo.getId());
						jsonArticulo.put("codigo", articulo.getCodigo());
						jsonArticulo.put("descripcion", articulo.getDescripcion());
						jsonArticulo.put("marca",  articulo.getMarca().getNombre());
						jsonArticulo.put("precioVenta", new DecimalFormat("#0.00").format(articulo.getPrecio() * ( 1 + indice.getMargen() / new Float(100))));
						jsonArticulo.put("margen", indice.getMargen() > 0);
						jsonArticulo.put("imagen", request.getServletContext().getContextPath() +  "/SmallImage/" + ((articulo.getArchivo() == null) ? "no_disponible.jpg" : articulo.getArchivo().getNombre()));
						jsonArticulos.add(jsonArticulo);
						break;
					}
				}
			}
			
			JSONObject json = new JSONObject();
			json.put("articulos", jsonArticulos);
			json.put("error", "");
			return json.toString();
		}
		catch(GalsException ex) {
			JSONObject json = new JSONObject();
			json.put("error", ex.getErrors().get(0).getDescripcion());
			return json.toString();
		}
		catch(Exception ex2) {
			JSONObject json = new JSONObject();
			json.put("error", ex2.getMessage());
			return json.toString();
		}
	}
	
	
	@PreAuthorize("hasRole('CATLOG')")
	@RequestMapping(value = "/Ver", method = RequestMethod.POST)
    public @ResponseBody String verArticulo(HttpServletRequest request, HttpServletResponse response) {
	
		try
		{
			Usuario usuarioConectado = this.getUsuario();
			Articulo articulo = new ArticuloService().getById(Integer.parseInt(request.getParameter("id")));	
			List<Indice> indices = new IndiceService().getAll((usuarioConectado.isEmpleado()) ? usuarioConectado.getEmpleador() : usuarioConectado);
			
			JSONObject jsonArticulo = new JSONObject();

			for(Indice indice : indices) {
				if(indice.getMarca().getId() == articulo.getMarca().getId() &&
					indice.getRubro().getId() == articulo.getRubro().getId()
				) {
					jsonArticulo.put("id", 	   articulo.getId());
					jsonArticulo.put("codigo", articulo.getCodigo());
					jsonArticulo.put("descripcion", articulo.getDescripcion());
					jsonArticulo.put("marca",  articulo.getMarca().getNombre());
					jsonArticulo.put("rubro",  articulo.getRubro().getNombre());
					jsonArticulo.put("precioLista", new DecimalFormat("#0.00").format(articulo.getPrecio()));
					jsonArticulo.put("precioVenta", new DecimalFormat("#0.00").format(articulo.getPrecio() * ( 1 + indice.getMargen() / new Float(100))));
					jsonArticulo.put("margen", indice.getMargen() > 0);
					jsonArticulo.put("imagen", request.getServletContext().getContextPath() +  "/BigImage/" + ((articulo.getArchivo() == null) ? "no_disponible.jpg" : articulo.getArchivo().getNombre()));
					break;
				}
			}			
			List<JSONObject> jsonObservaciones = new ArrayList<JSONObject>();
			for(Observacion observacion : articulo.getObservaciones()) {
				JSONObject jsonObservacion = new JSONObject();
				jsonObservacion.put("tipo_observacion", observacion.getTipoObservacion().getNombre());
				jsonObservacion.put("valor", 			observacion.getValor());
				jsonObservacion.put("unidad_medida",   (Arrays.asList(UnidadMedida.ASCII, UnidadMedida.NUMBER).contains(observacion.getTipoObservacion().getUnidadMedida())) ? "" : observacion.getTipoObservacion().getUnidadMedida().getValue());
				jsonObservaciones.add(jsonObservacion);
			}
			List<JSONObject> jsonEquivalencias = new ArrayList<JSONObject>();
			for(Equivalencia equivalencia : articulo.getEquivalencias()) {
				JSONObject jsonEquivalencia = new JSONObject();
				jsonEquivalencia.put("tipo_equivalencia", equivalencia.getTipoEquivalencia().getNombre());
				jsonEquivalencia.put("valor", 			  equivalencia.getValor());
				jsonEquivalencias.add(jsonEquivalencia);
			}
			jsonArticulo.put("observaciones", jsonObservaciones);
			jsonArticulo.put("equivalencias", jsonEquivalencias);
			
			JSONObject json = new JSONObject();
			json.put("articulo", jsonArticulo);
			json.put("error", "");
			return json.toString();
		}
		catch(GalsException ex) {
			JSONObject json = new JSONObject();
			json.put("error", ex.getErrors().get(0).getDescripcion());
			return json.toString();
		}
		catch(Exception ex2) {
			JSONObject json = new JSONObject();
			json.put("error", ex2.getMessage());
			return json.toString();
		}
	}
}
